package com.ltu.config;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Iterator;
import java.util.Map;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ltu.util.redis.RedisKeyManager;

import lombok.extern.slf4j.Slf4j;

/**
 * 
 * @Title: GlobalConfigDict.java
 * @Description: 自定义json配置文件的读写
 * @author 李生
 * @date 2023-11-15 03:56:25
 */
@Slf4j
@Component
public class GlobalJsonCfg {

	private final Environment env;
	private static JSONObject globalFileJson;
	private  String configPath = System.getProperties().getProperty("user.dir").concat(File.separator)
			.concat("config").concat(File.separator).concat("custom").concat(File.separator).concat("global-cfg-%s.json");

	public GlobalJsonCfg(@Autowired Environment env) {
		this.env = env;
		initalEnvConfig();

	}
//
//	@PostConstruct
//	public void initialEnvironment() throws IOException, Exception {
//		initalEnvConfig();
//	}

	// 初始化全局业务配置
	private void initalEnvConfig() {
		try {
			String profiles = env.getProperty("spring.profiles.active");
			// 读取资源文件配置
			configPath = String.format(configPath, profiles);
			FileInputStream in = new FileInputStream(new File(configPath));
//			InputStream in = getClass().getResourceAsStream(ConfigPath);
			if (null == in)
				throw new RuntimeException("robots_env_conf.json配置文件不存在");
			globalFileJson = JSON.parseObject(in, JSONObject.class);
			log.info("已加载全局业务配置：{}", globalFileJson.toJSONString());
		} catch (IOException e) {
			log.error("加载全局业务置出错：{}", e.getMessage());
			e.printStackTrace();
		} catch (Exception e) {
			log.error("加载全局业务配置出错：{}", e.getMessage());
			e.printStackTrace();
		}
	}

	// 获取全局配置
	public JSONObject getGlobalContans() {
		return globalFileJson;
	}

	// 修改全局配置
	public synchronized void editGlobalConfig(String key, Object obj) {
		globalFileJson.put(key, obj);
//		globalFileJson.put(profiles, globalConfigJson);
		overrideJSONFile();
	}
	
	private void overrideJSONFile() {
		try {
			// 1、创建文件
			File file = new File(configPath);
			if (!file.getParentFile().exists())
				file.getParentFile().mkdirs();
			if (file.exists())
				file.delete();
			file.createNewFile();
			// 2、创建一个输出流，用于将json字符持续写入文件
			Writer wirte = new OutputStreamWriter(new FileOutputStream(file));
			wirte.write(globalFileJson.toJSONString());// 数据输出流，输出到json文件中
			wirte.flush();
			wirte.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
	
	/**
	 * 获取 config下自定义的json文件配置
	 * @Description: TODO
	 * @author 李生
	 * @date 2023-11-15 03:29:05 
	 * @param cfgFileName
	 * @return
	 */
	private static JSONObject getCustomJsonCfg(String cfgFileName) {
		JSONObject	jsonCfg=null; 
		try {
			String filePath = System.getProperties().getProperty("user.dir").concat(File.separator)
					.concat("config").concat(File.separator).concat("custom").concat(File.separator).concat(cfgFileName);
			// 读取资源文件配置
			FileInputStream in = new FileInputStream(new File(filePath));
			if (null == in)
				throw new RuntimeException("robots_env_conf.json配置文件不存在");
			jsonCfg	= JSON.parseObject(in, JSONObject.class);
			log.info("已加载{}配置：{}",cfgFileName, jsonCfg.toJSONString());
		} catch (IOException e) {
			log.error("加载{}配置出错：{}",cfgFileName, e.getMessage());
			e.printStackTrace();
		} catch (Exception e) {
			log.error("加载{}配置出错：{}",cfgFileName, e.getMessage());
			e.printStackTrace();
		}
		return jsonCfg;
	}
	
	/**
	 *  修改config下的json文件配置
	 * @Description: TODO
	 * @author 李生
	 * @date 2023-11-15 03:47:49 
	 * @param cfgFileName 配置文件名称
	 * @param val
	 */
	public static  void editCustomJsonCfg(String cfgFileName,JSONObject  val) {
		try {
			JSONObject target =	 getCustomJsonCfg(cfgFileName);
			for (Map.Entry<String, Object> item: val.entrySet()) {
				target.put(item.getKey(), item.getValue());
			}
			// 1、创建文件
			String filePath = System.getProperties().getProperty("user.dir").concat(File.separator)
					.concat("config").concat(File.separator).concat("custom").concat(File.separator).concat(cfgFileName);
			File file = new File(filePath);
			if (!file.getParentFile().exists())
				file.getParentFile().mkdirs();
			if (file.exists())
				file.delete();
			file.createNewFile();
			// 2、创建一个输出流，用于将json字符持续写入文件
			Writer wirte = new OutputStreamWriter(new FileOutputStream(file));
			wirte.write(target.toJSONString());// 数据输出流，输出到json文件中
			wirte.flush();
			wirte.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}
